﻿// Wooden Sticks POJ - 1065.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;


/*
有一堆 n 根木棍。每根木棒的长度和重量都是预先知道的。这些木条将由一台木工机器逐一加工。
机器准备加工一根木棍需要一些时间，称为准备时间。设置时间与清洁操作、更换机器中的工具和形状有关。
木工机床的设置时间如下：
(a) 第一根木条的准备时间为 1 分钟。
(b) 在加工完一根长度为 l、重量为 w 的木棒后，如果 l <= l'，w <= w'，则加工一根长度为 l'、重量为 w'的木棒不需要准备时间。
否则，设置时间为 1 分钟。

您需要找出处理一堆 n 根木棒所需的最短设置时间。
例如，如果有五根木条，其长度和重量的配对分别是 ( 9 , 4 ) , ( 2 , 5 ) , ( 1 , 2 ) , ( 5 , 3 ) 和 ( 4 , 1 ) ，
那么最短的设置时间应该是 2 分钟，因为存在一个配对序列 ( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4 ) , ( 1 , 2 ) , ( 2 , 5 ) 。
输入
输入由 T 个测试用例组成。输入文件的第一行给出了测试用例的数量（T）。每个测试用例由两行组成：
第一行包含一个整数 n , 1 <= n <= 5000 , 表示测试用例中木棍的数量，第二行包含 2n 个正整数 l1 , w1 , l2 , w2 ,..., ln , wn , 
每个整数的大小最多为 10000 , 其中 li 和 wi 分别是第 i 根木棍的长度和重量。2n 个整数之间用一个或多个空格分隔。
输出结果
输出结果应包含以分钟为单位的最短设置时间，每行一个。

3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1

2
1
3

*/
//https://vjudge.csgrandeur.cn/problem/POJ-1065

const int N = 5010;
pair<int, int> p[N];
int n;
int t;

void solve() {
	//dilworth 定理
	int dp[N]; memset(dp, 0, sizeof dp);
	int maxlen = 1;
	p[0].second = -1;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < i; j++) {
			if (p[i].second < p[j].second) {
				dp[i] = max(dp[i], dp[j] + 1);
			}
		}
		maxlen = max(dp[i], maxlen);
	}

	cout <<  maxlen+1 << endl;

	return;
}

int main()
{
	cin >> t;
	while (t--){
		cin >> n;
		for (int i = 1; i <= n; i++) {
			int a, b; cin >> a >> b;
			p[i] = make_pair(a, b);
		}

		sort(p+1,p+1+n);

		solve();
	}

	return 0;
}
 